/* ***** BEGIN LICENSE BLOCK *****
 *   Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is ThumbsDown.
 *
 * The Initial Developer of the Original Code is
 * Atte Kemppilä.
 * Portions created by the Initial Developer are Copyright (C) 2008
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 * 
 * ***** END LICENSE BLOCK ***** */


var page = null;
var pages = {};
var model = null;


var wizard =
{
    isAdvancing: false,
    loadListeners: [],
    observers: [],
    prefObservers: [],
    
    onLoad: function()
    {
        this.elem = document.documentElement;
        
        for each (var callback in this.loadListeners)
            callback();
        
        this.initWizardPages();
        this.initPages();
        
        this.onPageShow({target: {pageid: this.elem.wizardPages[0].pageid}});
    },
    
    initWizardPages: function()
    {
        var wizardPages = this.elem.wizardPages;
        for (var i = 0; i < wizardPages.length; i++)
        {
            var elem = wizardPages[i];
            elem.setAttribute("onpageshow", "wizard.onPageShow(event)");
            //elem.setAttribute("onpagehide", "wizard.onPageHide()");
            elem.setAttribute("onpageadvanced", "return wizard.onPageAdvanced()");
            elem.setAttribute("onpagerewound", "return wizard.onPageRewound()");
        }
    },
    
    initPages: function()
    {
        var wizardPages = this.elem.wizardPages;
        for (var i = 0; i < wizardPages.length; i++)
        {
            let pageId = wizardPages[i].pageid;
            let page = pages[pageId];
            if (page && page.depends)
            {
                var callback = function(name) { page.dirty[name] = true; }
                model.addPropertyWatcher(callback, page.depends);
            }
        }
    },
    
    onUnload: function()
    {
        for each (var observer in this.observers)
            Services.obs.removeObserver(observer.observer, observer.topic);
        
        for each (var observer in this.prefObservers)
            Services.prefs.removeObserver(observer.prefName, observer.observer);
    },
    
    onPageShow: function(e)
    {
        var pageId = e.target.pageid;
        page = pages[pageId];
        
        if (page.onPageShow)
            page.onPageShow();
        
        page.firstRun = false;
        page.clearDirty();
        
        this.updateWizardButtons();
    },
    
    onPageAdvanced: function()
    {
        if (this.isAdvancing)
            this.isAdvancing = false;
        else if (page.onPageAdvanced)
            return page.onPageAdvanced();
        return true;
    },
    
    onPageRewound: function()
    {
        if (page.onPageRewound)
            return page.onPageRewound();
        return true;
    },
    
    advance: function(pageId)
    {
        this.isAdvancing = true;
        this.elem.advance(pageId);
        return false;
    },
    
    updateWizardButtons: function()
    {
        this.elem.canAdvance = (page.canAdvance ? page.canAdvance() : true);
        this.elem.canRewind  = (page.canRewind  ? page.canRewind()  : true);
    },
    
    addLoadListener: function(callback)
    {
        this.loadListeners.push(callback);
    },
    
    addObserver: function(observer, topic, ownsWeak)
    {
        Services.obs.addObserver(observer, topic, ownsWeak);
        this.observers.push({observer: observer, topic: topic});
    },
    
    addPrefObserver: function(observer, prefName, ownsWeak)
    {
        Services.prefs.addObserver(prefName, observer, ownsWeak);
        this.prefObservers.push({observer: observer, prefName: prefName});
    }
}


window.addEventListener("load", function(e) { wizard.onLoad(e); }, false);
window.addEventListener("unload", function(e) { wizard.onUnload(e); }, false);
